
(deftemplate cenario
	(slot tempo-lim) ;time limit
	(slot nome-cenario) ;name of scenario
	(slot num-nenufares) ;number of water lillies
	(slot min-linha) ;down
	(slot max-linha) ;up
	(slot min-coluna) ;left
	(slot max-coluna) ;right
)

(deftemplate objecto
	(slot cenario)
	(slot linha)
	(slot coluna))

(deftemplate nenufar extends objecto
	(slot ocupado
           (default FALSE)))
	

(deftemplate linha
	(slot cenario)
	(slot tipo)
	(slot index)
	(slot velocidade)
	(slot sentido)) ;direction


(deftemplate mobil extends objecto
	(slot tipo)
	(slot id-objecto))


;;; factos de cada cenario
	
(deffacts cenario-facil
    (cenario
	(tempo-lim 60)
	(nome-cenario  facil)
    (num-nenufares 2)
	(min-linha -8)
	(max-linha 8)
	(min-coluna -8)
	(max-coluna 8))


	(nenufar (cenario facil) (linha 8) (coluna -3))
	(nenufar (cenario facil) (linha 8) (coluna 0))

	(linha (cenario facil) (tipo relva) (index -8))
	(linha (cenario facil) (tipo relva) (index -7))
	(linha (cenario facil) (tipo relva) (index -6))
	(linha (cenario facil) (tipo relva) (index 0))
	(linha (cenario facil) (tipo relva) (index 1))
	(linha (cenario facil) (tipo relva) (index 2))

	(linha (cenario facil) (tipo estrada) (index -5) (sentido esquerda) (velocidade 4))
	(linha (cenario facil) (tipo estrada) (index -4) (sentido direita) (velocidade 3))
	(linha (cenario facil) (tipo estrada) (index -3) (sentido esquerda) (velocidade 2))
	(linha (cenario facil) (tipo estrada) (index -2) (sentido direita) (velocidade 3))
	(linha (cenario facil) (tipo estrada) (index -1) (sentido esquerda) (velocidade 2))

	(linha (cenario facil) (tipo rio) (index 7) (sentido esquerda) (velocidade 3))
	(linha (cenario facil) (tipo rio) (index 6) (sentido direita) (velocidade 5))
	(linha (cenario facil) (tipo rio) (index 5) (sentido esquerda) (velocidade 7))
	(linha (cenario facil) (tipo rio) (index 4) (sentido direita) (velocidade 4))
	(linha (cenario facil) (tipo rio) (index 3) (sentido esquerda) (velocidade 6))
	(linha (cenario facil) (tipo rio) (index 8))
;estrada
	(mobil (cenario facil) (tipo camiao) (id-objecto camiao-1) (linha -5) (coluna 0))
    (mobil (cenario facil) (tipo camiao) (id-objecto camiao-1) (linha -5) (coluna 1))
	(mobil (cenario facil) (tipo camiao) (id-objecto camiao-2) (linha -5) (coluna 3))
    (mobil (cenario facil) (tipo camiao) (id-objecto camiao-2) (linha -5) (coluna 4))
	(mobil (cenario facil) (tipo camiao) (id-objecto camiao-3) (linha -4) (coluna 0))
    (mobil (cenario facil) (tipo camiao) (id-objecto camiao-3) (linha -4) (coluna 1))
	(mobil (cenario facil) (tipo camiao) (id-objecto camiao-4) (linha -4) (coluna -4))
    (mobil (cenario facil) (tipo camiao) (id-objecto camiao-4) (linha -4) (coluna -5))
	(mobil (cenario facil) (tipo camiao) (id-objecto camiao-5) (linha -4) (coluna -8))
    (mobil (cenario facil) (tipo camiao) (id-objecto camiao-5) (linha -4) (coluna -7))
	(mobil (cenario facil) (tipo camiao) (id-objecto camiao-6) (linha -3) (coluna -3))
    (mobil (cenario facil) (tipo camiao) (id-objecto camiao-6) (linha -3) (coluna -2))
	(mobil (cenario facil) (tipo camiao) (id-objecto camiao-7) (linha -3) (coluna 7))
    (mobil (cenario facil) (tipo camiao) (id-objecto camiao-7) (linha -3) (coluna 6))
	
	(mobil (cenario facil) (tipo carro) (id-objecto carro-1) (linha -2) (coluna -4))
    (mobil (cenario facil) (tipo carro) (id-objecto carro-2) (linha -2) (coluna 0))
	(mobil (cenario facil) (tipo carro) (id-objecto carro-3) (linha -2) (coluna 4))
    (mobil (cenario facil) (tipo carro) (id-objecto carro-4) (linha -2) (coluna 6))

	(mobil (cenario facil) (tipo carro) (id-objecto carro-5) (linha -1) (coluna 2))
    (mobil (cenario facil) (tipo carro) (id-objecto carro-6) (linha -1) (coluna 3))
	(mobil (cenario facil) (tipo carro) (id-objecto carro-7) (linha -1) (coluna 4))
    (mobil (cenario facil) (tipo carro) (id-objecto carro-8) (linha -1) (coluna 5))
	(mobil (cenario facil) (tipo carro) (id-objecto carro-9) (linha -1) (coluna 6))
    (mobil (cenario facil) (tipo carro) (id-objecto carro-10) (linha -1) (coluna 7))

; rio
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-1) (linha 3) (coluna -8))
    (mobil (cenario facil) (tipo tronco) (id-objecto tronco-1) (linha 3) (coluna -7))
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-1) (linha 3) (coluna -6))
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-1) (linha 3) (coluna -5))
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-1) (linha 3) (coluna -4))
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-2) (linha 3) (coluna 5))
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-2) (linha 3) (coluna 6))
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-3) (linha 5) (coluna -4))
    (mobil (cenario facil) (tipo tronco) (id-objecto tronco-3) (linha 5) (coluna -3))
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-3) (linha 5) (coluna -2))
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-4) (linha 5) (coluna 4))
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-4) (linha 5) (coluna 5))
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-5) (linha 7) (coluna -6))
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-5) (linha 7) (coluna -5))
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-5) (linha 7) (coluna -4))
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-5) (linha 7) (coluna -3))
    (mobil (cenario facil) (tipo tronco) (id-objecto tronco-6) (linha 7) (coluna 1))
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-6) (linha 7) (coluna 2))
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-6) (linha 7) (coluna 3))
	(mobil (cenario facil) (tipo tronco) (id-objecto tronco-6) (linha 7) (coluna 4))


	(mobil (cenario facil) (tipo tartaruga) (id-objecto tartaruga-1) (linha 4) (coluna -4))
    (mobil (cenario facil) (tipo tartaruga) (id-objecto tartaruga-2) (linha 4) (coluna -3))
	(mobil (cenario facil) (tipo tartaruga) (id-objecto tartaruga-3) (linha 4) (coluna -2))
	(mobil (cenario facil) (tipo tartaruga) (id-objecto tartaruga-4) (linha 4) (coluna -1))
	(mobil (cenario facil) (tipo tartaruga) (id-objecto tartaruga-5) (linha 4) (coluna 8))
	(mobil (cenario facil) (tipo tartaruga) (id-objecto tartaruga-6) (linha 4) (coluna 7))
	(mobil (cenario facil) (tipo tartaruga) (id-objecto tartaruga-7) (linha 4) (coluna 6))
	(mobil (cenario facil) (tipo tartaruga) (id-objecto tartaruga-8) (linha 4) (coluna 5))
    (mobil (cenario facil) (tipo tartaruga) (id-objecto tartaruga-9) (linha 6) (coluna -3))
	(mobil (cenario facil) (tipo tartaruga) (id-objecto tartaruga-10) (linha 6) (coluna -2))
	(mobil (cenario facil) (tipo tartaruga) (id-objecto tartaruga-11) (linha 6) (coluna -1))
	(mobil (cenario facil) (tipo tartaruga) (id-objecto tartaruga-12) (linha 6) (coluna 0))
	(mobil (cenario facil) (tipo tartaruga) (id-objecto tartaruga-13) (linha 6) (coluna 8))
	(mobil (cenario facil) (tipo tartaruga) (id-objecto tartaruga-14) (linha 6) (coluna 7))

)



(deffacts cenario-dificil
    (cenario
	(tempo-lim 60)
	(nome-cenario  dificil)
    (num-nenufares 5) 
	(min-linha -8)
	(max-linha 8)
	(min-coluna -8)
	(max-coluna 8))

	(nenufar (cenario dificil) (linha 8) (coluna -6))
	(nenufar (cenario dificil) (linha 8) (coluna -3))
	(nenufar (cenario dificil) (linha 8) (coluna 0))
	(nenufar (cenario dificil) (linha 8) (coluna 3))
	(nenufar (cenario dificil) (linha 8) (coluna 6))

	(linha (cenario dificil) (tipo relva) (index -8))
	(linha (cenario dificil) (tipo relva) (index -7))
	(linha (cenario dificil) (tipo relva) (index -6))
	(linha (cenario dificil) (tipo relva) (index 0))
	(linha (cenario dificil) (tipo relva) (index 1))
	(linha (cenario dificil) (tipo relva) (index 2))

	(linha (cenario dificil) (tipo estrada) (index -5) (sentido esquerda) (velocidade 2))
	(linha (cenario dificil) (tipo estrada) (index -4) (sentido direita) (velocidade 1))
	(linha (cenario dificil) (tipo estrada) (index -3) (sentido esquerda) (velocidade 1))
	(linha (cenario dificil) (tipo estrada) (index -2) (sentido direita) (velocidade 1))
	(linha (cenario dificil) (tipo estrada) (index -1) (sentido esquerda) (velocidade 2))

	(linha (cenario dificil) (tipo rio) (index 7) (sentido esquerda) (velocidade 2))
	(linha (cenario dificil) (tipo rio) (index 6) (sentido esquerda) (velocidade 3))
	(linha (cenario dificil) (tipo rio) (index 5) (sentido esquerda) (velocidade 1))
	(linha (cenario dificil) (tipo rio) (index 4) (sentido esquerda) (velocidade 3))
	(linha (cenario dificil) (tipo rio) (index 3) (sentido esquerda) (velocidade 2))
	(linha (cenario dificil) (tipo rio) (index 8))

; estrada

	(mobil (cenario dificil) (tipo carro) (id-objecto carro-1) (linha -1) (coluna -7))
        (mobil (cenario dificil) (tipo carro) (id-objecto carro-2) (linha -1) (coluna -5))
	(mobil (cenario dificil) (tipo carro) (id-objecto carro-3) (linha -1) (coluna -2))
        (mobil (cenario dificil) (tipo carro) (id-objecto carro-4) (linha -1) (coluna 0))
	(mobil (cenario dificil) (tipo carro) (id-objecto carro-5) (linha -1) (coluna 3))
        (mobil (cenario dificil) (tipo carro) (id-objecto carro-6) (linha -1) (coluna 5))

	(mobil (cenario dificil) (tipo carro) (id-objecto carro-7) (linha -2) (coluna -6))
        (mobil (cenario dificil) (tipo carro) (id-objecto carro-8) (linha -2) (coluna -4))
	(mobil (cenario dificil) (tipo carro) (id-objecto carro-9) (linha -2) (coluna -2))
        (mobil (cenario dificil) (tipo carro) (id-objecto carro-10) (linha -2) (coluna 2))
	(mobil (cenario dificil) (tipo carro) (id-objecto carro-11) (linha -2) (coluna -5))

        (mobil (cenario dificil) (tipo carro) (id-objecto carro-12) (linha -3) (coluna -5))
        (mobil (cenario dificil) (tipo carro) (id-objecto carro-13) (linha -3) (coluna -2))
	(mobil (cenario dificil) (tipo carro) (id-objecto carro-14) (linha -3) (coluna 0))
        (mobil (cenario dificil) (tipo carro) (id-objecto carro-15) (linha -3) (coluna 3))
	(mobil (cenario dificil) (tipo carro) (id-objecto carro-16) (linha -3) (coluna 5))
        (mobil (cenario dificil) (tipo carro) (id-objecto carro-17) (linha -3) (coluna 8))

        (mobil (cenario dificil) (tipo carro) (id-objecto carro-18) (linha -4) (coluna -8))
        (mobil (cenario dificil) (tipo carro) (id-objecto carro-19) (linha -4) (coluna -6))
	(mobil (cenario dificil) (tipo carro) (id-objecto carro-20) (linha -4) (coluna 0))
        (mobil (cenario dificil) (tipo carro) (id-objecto carro-21) (linha -4) (coluna 3))
	(mobil (cenario dificil) (tipo carro) (id-objecto carro-22) (linha -4) (coluna 6))
 
        (mobil (cenario dificil) (tipo carro) (id-objecto carro-23) (linha -5) (coluna -5))
        (mobil (cenario dificil) (tipo carro) (id-objecto carro-24) (linha -5) (coluna -3))
	(mobil (cenario dificil) (tipo carro) (id-objecto carro-25) (linha -5) (coluna 0))
        (mobil (cenario dificil) (tipo carro) (id-objecto carro-26) (linha -5) (coluna 4))
	(mobil (cenario dificil) (tipo carro) (id-objecto carro-27) (linha -5) (coluna 6))

;; rio
	(mobil (cenario dificil) (tipo tronco) (id-objecto tronco-1) (linha 3) (coluna -5))
        (mobil (cenario dificil) (tipo tronco) (id-objecto tronco-1) (linha 3) (coluna -4))
	(mobil (cenario dificil) (tipo tronco) (id-objecto tronco-2) (linha 5) (coluna 0))
	(mobil (cenario dificil) (tipo tronco) (id-objecto tronco-2) (linha 5) (coluna 1))
	(mobil (cenario dificil) (tipo tronco) (id-objecto tronco-3) (linha 7) (coluna -4))
	(mobil (cenario dificil) (tipo tronco) (id-objecto tronco-3) (linha 7) (coluna -5))

	(mobil (cenario dificil) (tipo tartaruga) (id-objecto tartaruga-1) (linha 4) (coluna -7))
        (mobil (cenario dificil) (tipo tartaruga) (id-objecto tartaruga-2) (linha 4) (coluna -6))
	(mobil (cenario dificil) (tipo tartaruga) (id-objecto tartaruga-3) (linha 4) (coluna -4))
	(mobil (cenario dificil) (tipo tartaruga) (id-objecto tartaruga-4) (linha 4) (coluna -3))
	(mobil (cenario dificil) (tipo tartaruga) (id-objecto tartaruga-5) (linha 4) (coluna 4))
	(mobil (cenario dificil) (tipo tartaruga) (id-objecto tartaruga-6) (linha 4) (coluna 5))
	(mobil (cenario dificil) (tipo tartaruga) (id-objecto tartaruga-7) (linha 4) (coluna 6))
	(mobil (cenario dificil) (tipo tartaruga) (id-objecto tartaruga-8) (linha 6) (coluna -8))
        (mobil (cenario dificil) (tipo tartaruga) (id-objecto tartaruga-9) (linha 6) (coluna -7))
	(mobil (cenario dificil) (tipo tartaruga) (id-objecto tartaruga-10) (linha 6) (coluna 0))
	(mobil (cenario dificil) (tipo tartaruga) (id-objecto tartaruga-11) (linha 6) (coluna -1))
	(mobil (cenario dificil) (tipo tartaruga) (id-objecto tartaruga-12) (linha 6) (coluna 4))
	(mobil (cenario dificil) (tipo tartaruga) (id-objecto tartaruga-13) (linha 6) (coluna 5))
	(mobil (cenario dificil) (tipo tartaruga) (id-objecto tartaruga-14) (linha 6) (coluna 3))


)

(deffunction createLine (?tipo)
    (if (= (str-compare ?tipo "relva") 0) then
    (return "........")
        else(if (=(str-compare ?tipo "estrada") 0) then
            (return "--------") 
            else (return "~~~~~~~~"))
    )
    )

(defrule initDrawLine 
    (currentDrawLineIndex ?index)
    (linha (cenario ?scenario) (tipo ?tipo) (index ?index))
    =>
    (assert(lineToDraw (createLine ?tipo) ?index))
    )

(defrule chageDrawLine
    (currentDrawLineIndex ?index)
    (currentDrawColumnIndex ?column)
    ?r <- (lineToDraw ?parsed ?index)
    (mobil (tipo ?tipo) (linha ?index) (coluna ?column))
    =>
    (retract ?r)
    (assert(lineToDraw (changeLine ?tipo ?parsed ?column) ?index))
    (retract ?columnFact)
    (assert (columnFact (+ ?column 1)))
    )

(defrule skipColumn
    (currentDrawLineIndex ?index)
    ?columnFact <- (currentDrawColumnIndex ?column)
    (not(mobil (tipo ?tipo) (linha ?index) (coluna ?column)))
    =>
    (retract ?columnFact)
    (assert (columnFact (+ ?column 1)))
    )

(defrule drawLine
    ?indexFact <- (currentDrawLineIndex ?index)
    (lineToDraw ?parsed ?index)
    =>
    (retract ?indexFact)
    (assert  (currentDrawLineIndex (- ?index 1)))
    (printout t ?parsed crlf)
    )

(deffacts initialfacts (currentDrawLineIndex 6))

(reset)
(run) ;run all
;(facts)
	
